---
sidebar_position: 2
toc_min_heading_level: 2
toc_max_heading_level: 2
---

# login

登录

## 功能介绍

:::info 说明

用户登录，需等待成功回调后再进行其他接口调用。  
您需要在以下场景调用 login 接口：  
（1）App 启动后首次使用；  
（2）登录后 token 过期，app 跳转到登录页面，再从服务端获取 token 后，并调用 login 重新登录；  
（3）在线时被踢下线，用户在线情况下被踢下线，此时可以在 UI 提示用户，再从服务端获取 token 后，并调用 login 重新登录。

以下场景无需调用 login 接口：  
（1）用户的网络断开并重新连接后；  
（2）当一个登录过程在进行时，不需要进行重复登录。

:::

:::caution 注意

（1）如出现失败回调，重试是无意义的，检查参数后调整代码再继续；  
（2）在一个 App 中，SDK 不支持多个帐号同时登录，需先调用退出登录，才能登录其他帐号；  
（3）除设置监听和初始化之外的所有接口，必须在 SDK 登录回调成功后才能调用。

:::

<Tabs
groupId="sdks-language"
values={[
{ label: 'iOS', value: 'iOS', },
{ label: 'Android', value: 'Android', },
{ label: 'Flutter', value: 'Flutter', },
{ label: 'Uniapp', value: 'Uniapp', },
{ label: 'Web', value: 'Web', },
]
}>

<TabItem value="Flutter">

### 函数原型

```dart showLineNumbers
 Future<UserInfo> login({
    required String userID,
    required String token,
    String? operationID,
    Future<UserInfo> Function()? defaultValue,
  })
```

### 输入参数

| 参数名称    | 参数类型 | 是否必填 | 描述                                                                |
| ----------- | -------- | -------- | ------------------------------------------------------------------- | --- |
| operationID | String?  | 否       | 操作 ID，用于定位问题，保持唯一，建议用当前时间和随机数             |
| userID      | String   | 是       | IM 用户 userID                                                      |
| token       | String   | 是       | OpenIM 用户令牌，业务后台验证用户账号密码后，通过 user_token 来获取 |     |

### 返回结果

| 名称 | 字段类型                                      | 描述           |
| ---- | --------------------------------------------- | -------------- |
| ~    | [UserInfo](docs/sdks/Class/User/UserInfo.mdx) | 当前登陆者信息 |

### 代码示例

```dart showLineNumbers
   UserInfo userInfo = await OpenIM.iMManager.login(userID: '', token: '');
```

</TabItem>

<TabItem value="iOS">

### 函数原型

```swift showLineNumbers
- (void)login:(NSString *)userID
        token:(NSString *)token
    onSuccess:(nullable OIMSuccessCallback)onSuccess
    onFailure:(nullable OIMFailureCallback)onFailure;
```

### 输入参数

| 参数名称    | 参数类型 | 是否必填 | 描述                                                                |
| ----------- | -------- | -------- | ------------------------------------------------------------------- | --- |
| operationID | NSString | 否       | 操作 ID，用于定位问题，保持唯一，建议用当前时间和随机数             |
| userID      | NSString | 是       | IM 用户 userID                                                      |
| token       | NSString | 是       | OpenIM 用户令牌，业务后台验证用户账号密码后，通过 user_token 来获取 |     |

### 返回结果

| 参数名称  | 参数类型                                               | 描述     |
| --------- | ------------------------------------------------------ | -------- |
| onSuccess | [OIMSuccessCallback](docs/sdks/Callback/onSuccess.mdx) | 成功返回 |
| onFailure | [OIMFailureCallback](docs/sdks/Callback/onError.mdx)   | 失败返回 |

### 代码示例

```swift showLineNumbers

[OIMManager.manager login:@"" // userID来自于自身业务服务器
                    token:@""  // token需要业务服务器向OpenIM服务端交换获取
                onSuccess:^(NSString * _Nullable data) {
} onFailure:^(NSInteger code, NSString * _Nullable msg) {
}];

```

</TabItem>

<TabItem value="Android">

### 参数详解

</TabItem>

<TabItem value="Web">

### 参数详解

</TabItem>

<TabItem value="Uniapp">

### 参数详解

| 参数名称    | 参数类型 | 是否必填 | 描述                                 |
| ----------- | -------- | -------- | ------------------------------------ | --- |
| operationID | string   | 是       | 唯一随机字符串，用于根据日志定位问题 |
| userID      | string   | 是       | IM 用户 userID                       |
| token       | string   | 是       | IM 用户 token                        |     |

### 返回模板

```
Promise<void>
```

### 代码示例

```js showLineNumbers
import IMSDK from '@openim-sdk/uniapp-polyfill';

await IMSDK.API.login(IMSDK.uuidv4(), userID, token);
```

</TabItem>

</Tabs>
